第 5 章 AUDIO 功能 ============ 1、概述 ######### HID和SPP_AND_LE 新添加了AUDIO的实现示例代码,需要使用AUDIO功能要在板级配置使能 TCFG_AUDIO_ENABLE ,如下代码所示: .. code-block:: c //支持Audio功能,才能使能DAC/ADC模块   #ifdef CONFIG_LITE_AUDIO   #define TCFG_AUDIO_ENABLE                   ENABLE   #if TCFG_AUDIO_ENABLE   #undef TCFG_AUDIO_ADC_ENABLE   #undef TCFG_AUDIO_DAC_ENABLE   #define TCFG_AUDIO_ADC_ENABLE               ENABLE_THIS_MOUDLE   #define TCFG_AUDIO_DAC_ENABLE               ENABLE_THIS_MOUDLE  2、Audio的使用 ################ DAC硬件输出参数配置 | 在板级配置文件里面有如下配置: .. code-block:: c /*  DAC硬件上的连接方式,可选的配置:      DAC_OUTPUT_MONO_L               左声道      DAC_OUTPUT_MONO_R               右声道      DAC_OUTPUT_LR                   立体声      DAC_OUTPUT_MONO_LR_DIFF         单声道差分输出  */   #define TCFG_AUDIO_DAC_CONNECT_MODE         DAC_OUTPUT_MONO_LR_DIFF  需要根据具体的硬件接法,配置 TCFG_AUDIO_DAC_CONNECT_MODE 宏。 MIC配置和使用 | 1)配置说明 | 在每个 board.c 文件里都有配置 mic 参数的结构体,如下所示: .. code-block:: c struct adc_platform_data adc_data = {       .mic_channel    = TCFG_AUDIO_ADC_MIC_CHA,                   //MIC通道选择,对于693x,MIC只有一个通道,固定选择右声道   /*MIC LDO电流档位设置:      0:0.625ua    1:1.25ua    2:1.875ua    3:2.5ua*/       .mic_ldo_isel   = TCFG_AUDIO_ADC_LDO_SEL,   /*MIC 是否省隔直电容:      0: 不省电容  1: 省电容 */   #if ((TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR) || (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF))       .mic_capless    = 0,//四声道与双声道差分使用,不省电容接法   #else       .mic_capless    = 0,   #endif   /*MIC免电容方案需要设置,影响MIC的偏置电压      21:1.18K    20:1.42K    19:1.55K    18:1.99K    17:2.2K     16:2.4K     15:2.6K     14:2.91K    13:3.05K    12:3.5K     11:3.73K      10:3.91K    9:4.41K     8:5.0K      7:5.6K      6:6K        5:6.5K      4:7K        3:7.6K      2:8.0K      1:8.5K              */       .mic_bias_res   = 16,   /*MIC LDO电压档位设置,也会影响MIC的偏置电压      0:2.3v  1:2.5v  2:2.7v  3:3.0v */       .mic_ldo_vsel  = 2,   /*MIC电容隔直模式使用内部mic偏置*/       .mic_bias_inside = 1,   /*保持内部mic偏置输出*/       .mic_bias_keep = 0,       // ladc 通道       .ladc_num = ARRAY_SIZE(ladc_list),       .ladc = ladc_list,   };  主要关注以下变量: | ① mic_capless:0:选用不省电容模式 1:选用省电容模式; | ② mic_bias_res:选用省电容模式的时候才有效,mic 的上拉偏置电阻,选择范围为: | 1:16K 2:7.5K 3:5.1K 4:6.8K 5:4.7K 6:3.5K 7:2.9K 8:3K 9:2.5K 10:2.1K 11:1.9K 12:2K 13:1.8K 14:1.6K 15:1.5K 16:1K 31:0.6K; | ③ mic_ldo_vsel:mic_ldo 的偏置电压,与偏置电阻共同决定 mic 的偏置,选择范围为:0:2.3v 1:2.5v 2:2.7v 3:3.0v; | ④ mic_bias_inside:mic 外部电容隔直,芯片内部提供偏置电压,当 mic_bias_inside=1,可以正常使用 mic_bias_res 和 mic_ldo_vsel。 2)自动校准 MIC 偏置电压 | 使用省电容模式时,可在 app_config.h 配置 TCFG_MC_BIAS_AUTO_ADJUST,选择 MIC 的自动校准模式,自动选择对应的MIC 偏置电阻和偏置电压。配置如下: .. admonition:: 注 不省电容无法校准。 .. code-block:: c /*  *省电容mic偏置电压自动调整(因为校准需要时间,所以有不同的方式)  *1、烧完程序(完全更新,包括配置区)开机校准一次  *2、上电复位的时候都校准,即断电重新上电就会校准是否有偏差(默认)  *3、每次开机都校准,不管有没有断过电,即校准流程每次都跑  */   #define MC_BIAS_ADJUST_DISABLE      0   //省电容mic偏置校准关闭   #define MC_BIAS_ADJUST_ONE          1   //省电容mic偏置只校准一次(跟dac trim一样)   #define MC_BIAS_ADJUST_POWER_ON     2   //省电容mic偏置每次上电复位都校准(Power_On_Reset)   #define MC_BIAS_ADJUST_ALWAYS       3   //省电容mic偏置每次开机都校准(包括上电复位和其他复位)   #define TCFG_MC_BIAS_AUTO_ADJUST    MC_BIAS_ADJUST_POWER_ON   #define TCFG_MC_CONVERGE_TRACE      0   //省电容mic收敛值跟踪  Audio_MIDI的文件下载配置 <<<<<<<<<<<<<<<<<< 1)在SDK\cpu\br23\tools下添加对应 ``midi.bin`` 文件,在同级目录的 ``download.bat`` 下添加下载项: .. code-block:: c isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin cfg_tool.bin -res midi.bin %1 在 ``download.bat`` 同级目录的 ``isd_config.ini`` 文件添加: .. code-block:: c INTERNAL_DIR_ALIGN=0X2; //flash 内目录里的文件起始地址4对齐。 2)在对应的 ``SDK\apps\spp_and_le\board\br23\board_ac635n_demo_cfg.h`` 文件中,使能AUDIO功能: .. code-block:: c #define TCFG_AUDIO_ENABLE 1//DISABLE #define AUDIO_MIDI_CTRL_CONFIG 1 //midi电子琴接口使能 ,开这个宏要关掉低功耗使能 关闭低功耗模式: #define TCFG_LOWPOWER_LOWPOWER_SEL 0//SLEEP_EN //SNIFF状态下芯片是否进入powerdown#if TCFG_USER_BLE_ENABLE 3)在 ``SDK/cpu/br23/audio_dec/audio_dec_midi_ctrl.c`` 中做如下设置:具体函数内容以SDK为准。 .. code-block:: c oid midi_paly_test(u32 key) { static u8 open_close = 0; static u8 change_prog = 0; static u8 note_on_off = 0; switch (key) { case KEY_IR_NUM_0: if (!open_close) { /* midi_ctrl_dec_open(16000);//启动midi key */ //midi_ctrl_dec_open(16000, "storage/sd0/C/MIDI.bin\0");//启动midi key SD卡 midi_ctrl_dec_open(16000,SDFILE_RES_ROOT_PATH"MIDI.bin\0");//启动midi key 系统 } else { midi_ctrl_dec_close();//关闭midi key } open_close = !open_close; break; case KEY_IR_NUM_1: if (!change_prog) { midi_ctrl_set_porg(0, 0);//设置0号乐器,音轨0 } else { midi_ctrl_set_porg(22, 0);//设置22号乐器,音轨0 } change_prog = !change_prog; break; case KEY_IR_NUM_2: if (!note_on_off) { //模拟按键57、58、59、60、61、62,以力度127,通道0,按下测试 ... } else //模拟按键57、58、59、60、61、62松开测试 ... } note_on_off = !note_on_off; break; default: break; } } 4)在 ``app_spp_and_le.c`` 种调用midi_play_test()函数播放对应文件: .. code-block:: c static void app_key_event_handler(struct sys_event *event) { ...... #if TCFG_AUDIO_ENABLE if (event_type == KEY_EVENT_CLICK && key_value == TCFG_ADKEY_VALUE0) { /*midi test*/ printf(">>>key0:open midi\n"); midi_paly_test(KEY_IR_NUM_0); } if (event_type == KEY_EVENT_CLICK && key_value == TCFG_ADKEY_VALUE1) { printf(">>>key0:set midi\n"); midi_paly_test(KEY_IR_NUM_1); } if (event_type == KEY_EVENT_CLICK && key_value == TCFG_ADKEY_VALUE2) printf(">>>key2:play midi\n"); midi_paly_test(KEY_IR_NUM_2); }